package com.xtoad.ecms.baseinfo.service.impl;

import com.xtoad.ecms.baseinfo.converter.RoleConverter;
import com.xtoad.ecms.baseinfo.dto.RoleDTO;
import com.xtoad.ecms.baseinfo.model.Role;
import com.xtoad.ecms.baseinfo.repository.IRoleRepository;
import com.xtoad.ecms.baseinfo.service.IRoleService;
import com.xtoad.ecms.common.web.exception.BusinessException;
import com.xtoad.ecms.common.web.exception.ResultCodeEnum;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;

/**
 * 角色服务实现类
 *
 * @author xtoad
 * @date 2020/05/29
 */
@Service
public class RoleServiceImpl implements IRoleService {

    @Resource
    IRoleRepository roleRepository;
    @Resource
    RoleConverter roleConverter;

    /**
     * 根据id查询角色
     *
     * @param id 角色id
     * @return 查询结果
     */
    @Override
    public RoleDTO getRoleById(final Long id) {
        Optional<Role> role = roleRepository.findById(id);
        if (role.isPresent()) {
            return roleConverter.toDto(role.get());
        }
        throw new BusinessException(ResultCodeEnum.NOT_FOUND);
    }

    /**
     * 根据编码查询角色
     *
     * @param code 角色编码
     * @return 查询结果
     */
    @Override
    public List<RoleDTO> getRoleByCode(final String code) {
        List<Role> roles = roleRepository.findByCodeContaining(code);
        return roleConverter.toDtoList(roles);
    }

    /**
     * 根据角色名称查询角色
     *
     * @param name 角色名称
     * @return 查询结果
     */
    @Override
    public List<RoleDTO> getRoleByName(final String name) {
        List<Role> roles = roleRepository.findByNameContaining(name);
        return roleConverter.toDtoList(roles);
    }

    /**
     * 查询全部角色，不分页
     *
     * @return 查询结果
     */
    @Override
    public List<RoleDTO> getAllRole() {
        List<Role> allRoles = roleRepository.findAll();
        return roleConverter.toDtoList(allRoles);
    }

    /**
     * 新增角色
     *
     * @param roleDTO 保存对象
     * @return 新增结果
     */
    @Override
    public RoleDTO insert(final RoleDTO roleDTO) {
        Role role = roleConverter.toModel(roleDTO);
        role = roleRepository.save(role);
        return roleConverter.toDto(role);
    }

    /**
     * 删除角色
     *
     * @param roleDTO 删除对象
     */
    @Override
    public void delete(final RoleDTO roleDTO) {
        Role role = roleConverter.toModel(roleDTO);
        roleRepository.delete(role);
    }

    /**
     * 删除角色
     *
     * @param id 删除对象Id
     */
    @Override
    public void deleteById(final Long id) {
        roleRepository.deleteById(id);
    }

    /**
     * 更新角色
     *
     * @param roleDTO 更新对象
     * @return 更新结果
     */
    @Override
    public RoleDTO update(final RoleDTO roleDTO) {
        Role role = roleConverter.toModel(roleDTO);
        role = roleRepository.save(role);
        return roleConverter.toDto(role);
    }

    /**
     * 批量新增角色
     *
     * @param roleDTOList 新增对象
     * @return 新增结果
     */
    @Override
    public List<RoleDTO> batchInsert(final List<RoleDTO> roleDTOList) {
        List<Role> roles = roleConverter.toModelList(roleDTOList);
        roles = roleRepository.saveAll(roles);
        return roleConverter.toDtoList(roles);
    }

    /**
     * 批量删除角色
     *
     * @param roleDTOList 删除对象
     */
    @Override
    public void batchDelete(final List<RoleDTO> roleDTOList) {
        List<Role> roles = roleConverter.toModelList(roleDTOList);
        roleRepository.deleteInBatch(roles);
    }

    /**
     * 批量更新角色
     *
     * @param roleDTOList 更新对象
     * @return 更新结果
     */
    @Override
    public List<RoleDTO> batchUpdate(final List<RoleDTO> roleDTOList) {
        List<Role> roles = roleConverter.toModelList(roleDTOList);
        roles = roleRepository.saveAll(roles);
        return roleConverter.toDtoList(roles);
    }
}
